// 计算校验和
function calculateChecksum(data) {
  console.log([data.DataType, data.Length].concat(data.Data), '校验数据')
  const arr = [data.DataType, data.Length].concat(data.Data)
  let sum = 0;
  for (let i = 0; i < arr.length; i++) {
    sum += arr[i];
    sum = sum & 0xFF;
  }
  let checksum = sum ^ 0xFF;
  console.log(checksum, '校验和')
  console.log(checksum.toString(16), '校验和16进制')
  return checksum;
}

// 数据包装发送
export const createBuffer = (total, DataType, Length, Data) => {
  let buffer = new ArrayBuffer(total)
  let dataView = new DataView(buffer)
  // Head Code
  dataView.setUint8(0, 0x2E)
  // DataType
  dataView.setUint8(1, DataType)
  // Length
  dataView.setUint8(2, Length)
  // Data
  if (Data && Data.length) {
    Data.forEach((el, index) => {
      dataView.setUint8(index + 3, el)
    })
  }
  // SUM
  const SUM = calculateChecksum({
    DataType: DataType,
    Length: Length,
    Data: Data
  })

  dataView.setUint8(total - 1, SUM)

  console.log(dataView, 'dataViewdataViewdataView')

  return buffer
}


// 数据解析
export const dataAnalysis = (res) => {
  // res 2e  01   01   xxxxxxxxx  sum
  //     固定 类型 长度 数据        和
  // 数据头两位固定格式2e  只筛选2e开头数据
  // 去除数据前六位和最后两位 剩下中间data部分
  // console.log(res, '数据部分--------')

  if (res.substring(0, 2) == '2e') {
    wx.setStorageSync('data', res)
    const str = res.substring(6).slice(0, -2);
    // console.log(str, '数据部分--------')
    //类型 
    if (res.substring(2, 4) == '10') {
      // 蓝牙页面显示的信息 
      console.log('蓝牙页面显示的信息----')
      return buleAppInfo(str)
    } else if (res.substring(2, 4) == '20') {
      // 预留
    } else if (res.substring(2, 4) == '30') {
      // 充电头版本信息
      console.log('充电头版本信息----')
      return buleAppVersionInfo(str)
    }
  } else {
    // 如果不是2e开头说明上次数据未发完继续解析
    const result = wx.getStorageSync('data')
    const totalStr = result + res
    return dataAnalysis(totalStr)
  }
}

//'1234567890'-> [12,34,56,78,90]
function splitNumbers(str) {
  const result = [];
  for (let i = 0; i < str.length; i += 2) {
    const chunk = str.slice(i, i + 2);
    result.push(chunk);
  }
  return result;
}
// 解决计算精度
function Mul(arg1, arg2) {
  var r1 = arg1.toString(),
    r2 = arg2.toString(),
    m, resultVal, d = arguments[2];
  m = (r1.split(".")[1] ? r1.split(".")[1].length : 0) + (r2.split(".")[1] ? r2.split(".")[1].length : 0);
  resultVal = Number(r1.replace(".", "")) * Number(r2.replace(".", "")) / Math.pow(10, m);
  return typeof d !== "number" ? Number(resultVal) : Number(resultVal.toFixed(parseInt(d)));
}


// 蓝牙页面显示的信息
function buleAppInfo(str) {
  const arr = splitNumbers(str)
  const result = {
    type: 1, //类型
    kgxx: [arr[0]], //开关量信息
    xqdy: [arr[2] ? arr[2] : 0, arr[1] ? arr[1] : 0], //需求电压 精度:1V
    xqdl: [arr[3] ? arr[3] : 0], //需求电流 精度:1A
    xqdlsoc: arr[4] ? arr[4] : 0, //需求电量 SOC 精度:1%
    clxlh: [
      arr[5] ? arr[5] : 0,
      arr[6] ? arr[6] : 0,
      arr[7] ? arr[7] : 0,
      arr[8] ? arr[8] : 0,
      arr[9] ? arr[9] : 0,
      arr[10] ? arr[10] : 0,
      arr[11] ? arr[11] : 0,
      arr[12] ? arr[12] : 0,
      arr[13] ? arr[13] : 0,
      arr[14] ? arr[14] : 0,
      arr[15] ? arr[15] : 0,
      arr[16] ? arr[16] : 0,
      arr[17] ? arr[17] : 0,
      arr[18] ? arr[18] : 0,
      arr[19] ? arr[19] : 0,
      arr[20] ? arr[20] : 0,
      arr[21] ? arr[21] : 0,

      
    ], //车辆序列号
    mxddy: [arr[23] ? arr[23] : 0, arr[22] ? arr[22] : 0], //母线总电压 精度:1V
    mxzdl: [arr[25] ? arr[25] : 0, arr[24] ? arr[24] : 0], //母线总电流 精度:0.01A
    dqcdgl: [arr[27] ? arr[27] : 0, arr[26] ? arr[26] : 0], //当前充电功率 精度:0.1KW
    dqsoc: [arr[29] ? arr[29] : 0, arr[28] ? arr[28] : 0], //当前 SOC 精度:0.1%
    zddydch: arr[30] ? arr[30] : 0, //最低电压电池号
    zdyz: [arr[32] ? arr[32] : 0, arr[31] ? arr[31] : 0], //最低电压电池号电压值 精度:0.001V
    zddydch2: arr[33] ? arr[33] : 0, //最高电压电池号
    zdyz2: [arr[35] ? arr[35] : 0, arr[34] ? arr[34] : 0], //最高电压电池号电压值   精度:0.001V
    zdwddch: arr[36] ? arr[36] : 0, //最低温度电池号
    zdwdz: arr[37] ? arr[37] : 0, //最低温度电池号温度值  精度:1℃
    zgwddch: arr[38] ? arr[38] : 0, //最高温度电池号 
    zgwdz: arr[39] ? arr[39] : 0, //最高温度电池号温度值  精度:1℃
    czzscdyz: [arr[41] ? arr[41] : 0, arr[40] ? arr[40] : 0], //充电桩输出电压值  精度:0.1V
    czsscdlz: [arr[43] ? arr[43] : 0, arr[42] ? arr[42] : 0], //充电桩输出电流值 精度:0.1A
    ljcdsj: [arr[45] ? arr[45] : 0, arr[44] ? arr[44] : 0], //累计充电时间 精度:1 分种
    cdsysj: [arr[47] ? arr[47] : 0, arr[46] ? arr[46] : 0], //充电剩余时间 精度:1 分种
    dczerror: [arr[48] ? arr[48] : 0, arr[49] ? arr[49] : 0, arr[50] ? arr[50] : 0, arr[51] ? arr[51] : 0], //充电桩错误状态
    bms: [arr[52] ? arr[52] : 0, arr[53] ? arr[53] : 0, arr[54] ? arr[54] : 0, arr[55] ? arr[55] : 0], //BMS 错误状态
    gjdl: arr[56] ? arr[56] : 0, //关机电流
  }
  // 把上面每一项属性数值转换成十进制并且x精度
  console.log(result.xqdy, '--------需求电压')
  console.log(result.xqdl, '--------需求电流')
  console.log(result.xqdlsoc, '--------需求电量 SOC')
  console.log(result.mxddy, '--------母线总电压')
  console.log(result.mxzdl, '--------母线总电流')
  console.log(result.dqcdgl, '--------当前充电功率')
  console.log(result.dqsoc, '--------当前 SOC ')
  console.log(result.zddydch, '--------最低电压电池号 ')
  console.log(result.zdyz, '--------最低电压电池号电压值 ')
  console.log(result.zddydch2, '--------最高电压电池号 ')
  console.log(result.zdyz2, '--------最高电压电池号电压值')
  console.log(result.zdwddch, '--------最低温度电池号')
  console.log(result.zdwdz, '--------最低温度电池号温度值')
  console.log(result.zgwddch, '--------最高温度电池号 ')
  console.log(result.zgwdz, '--------最高温度值')
  console.log(result.czzscdyz, '--------充电桩输出电压值')
  console.log(result.czsscdlz, '--------充电桩输出电流值')
  console.log(result.ljcdsj, '--------时间1')
  console.log(result.cdsysj, '--------时间2')
  console.log(result.gjdl, '--------关机电流')
  console.log(result.clxlh)
  console.log(hexToAscii(result.clxlh[0] + result.clxlh[1] + result.clxlh[2] + result.clxlh[3] + result.clxlh[4] + result.clxlh[5] + result.clxlh[6] + result.clxlh[7] + result.clxlh[8] + result.clxlh[9] + result.clxlh[10] + result.clxlh[11] + result.clxlh[12] + result.clxlh[13] + result.clxlh[14] + result.clxlh[15] + result.clxlh[16]))
  const newRes = {
    type: 1, //类型
    kgxx: [arr[0]], //开关量信息
    xqdy: parseInt(result.xqdy[0] + result.xqdy[1], 16) * 1,
    xqdl: parseInt(result.xqdl[0], 16) * 1,
    xqdlsoc: parseInt(result.xqdlsoc, 16) * 1,
    clxlh: hexToAscii(result.clxlh[0] + result.clxlh[1] + result.clxlh[2] + result.clxlh[3] + result.clxlh[4] + result.clxlh[5] + result.clxlh[6] + result.clxlh[7] + result.clxlh[8] + result.clxlh[9] + result.clxlh[10] + result.clxlh[11] + result.clxlh[12] + result.clxlh[13] + result.clxlh[14] + result.clxlh[15] + result.clxlh[16]),
    mxddy: parseInt(result.mxddy[0] + result.mxddy[1], 16) * 1,
    mxzdl: Mul(parseInt(result.mxzdl[0] + result.mxzdl[1], 16), 0.01),
    dqcdgl: Mul(parseInt(result.dqcdgl[0] + result.dqcdgl[1], 16), 0.1),
    dqsoc: Mul(parseInt(result.dqsoc[0] + result.dqsoc[1], 16), 0.1),
    zddydch: parseInt(result.zddydch, 16),
    zdyz: Mul(parseInt(result.zdyz[0] + result.zdyz[1], 16), 0.001),
    zddydch2: parseInt(result.zddydch2, 16),
    zdyz2: Mul(parseInt(result.zdyz2[0] + result.zdyz2[1], 16), 0.001),
    zdwddch: parseInt(result.zdwddch, 16),
    zdwdz: parseInt(result.zdwdz, 16) - 50,
    zgwddch: parseInt(result.zgwddch, 16),
    zgwdz: parseInt(result.zgwdz, 16) - 50,
    czzscdyz: Mul(parseInt(result.czzscdyz[0] + result.czzscdyz[1], 16), 0.1),
    czsscdlz: Math.abs(Mul(parseInt(result.czsscdlz[0] + result.czsscdlz[1], 16), 0.1) - 400).toFixed(1),
    ljcdsj: parseInt(result.ljcdsj[0] + result.ljcdsj[1], 16) * 1,
    cdsysj: parseInt(result.cdsysj[0] + result.cdsysj[1], 16) * 1,
    dczerror: result.dczerror,
    bms: result.bms,
    gjdl: parseInt(result.gjdl, 16) * 1,
  }

  // console.log(newRes, '转化后结果')
  return newRes

}


// 蓝牙版本信息
function buleAppVersionInfo(str) {
  const varsion = hexToAscii(str)
  return {
    type: 2, //类型
    version: varsion
  }
}

// 转ascll
function hexToAscii(hexString) {
  let asciiString = '';
  for (let i = 0; i < hexString.length; i += 2) {
    let hex = hexString.substr(i, 2);
    let decimal = parseInt(hex, 16);
    asciiString += String.fromCharCode(decimal);
  }
  return asciiString;
}

// js 10进制转小端 
export const decimalToLittleEndian = (decimal) => {
  let littleEndian = []; // 存放结果的数组
  for (let i = 1; i >= 0; i--) {
    const byte = decimal & 255; // 取最后8位作为一个字节
    littleEndian.push(byte); // 添加到结果数组中
    decimal >>= 8; // 右移8位，去除已处理的部分
  }
  // return [littleEndian[0].toString(16), littleEndian[1].toString(16)];
  return littleEndian
}